﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using ECommerce.BLL.Order;
using Jzy.Core.Utility;
using ECommerce.Model.Order;
using ECommerce.Common;
using Com.Alipay;
using Jzy.Core.Log.Exceptions;

namespace ECommerce.Web.Alipay
{
    public partial class Send : System.Web.UI.Page
    {
        private ECOrderBO Order
        {
            get
            {
                return ECOrderBO.Instance<ECOrderBO>();
            }
        }

        private ECOrderPayBO OrderPay
        {
            get
            {
                return ECOrderPayBO.Instance<ECOrderPayBO>();
            }
        }

        private long OrderID
        {
            get
            {
                return long.Parse(StrUtil.DecryptUrl(Request.QueryString["OrderID"]));
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                ECOrderInfo orderInfo = this.Order.GetInfo(OrderID);
                ECOrderPayInfo payInfo = this.OrderPay.GetInfoByOrderID(OrderID);
                if (payInfo == null)
                {
                    //生成支付订单
                    ECOrderPayBO orderPay = new ECOrderPayBO();

                    payInfo = new ECOrderPayInfo();
                    payInfo.ID = this.Order.GetOrderID();
                    payInfo.OrderID = this.OrderID;
                    payInfo.MemberID = SiteSession.MemberID;
                    payInfo.MemberLoginName = SiteSession.MemberLoginName;
                    payInfo.MemberRemain = orderInfo.MemberRemain;
                    payInfo.Amount = orderInfo.TradeValue + orderInfo.Freight;
                    payInfo.State = (int)PayState.未支付;
                    payInfo.PayInterface = (int)PayInterface.支付宝;
                    orderPay.Save(payInfo, true);
                }

                ////////////////////////////////////////////请求参数////////////////////////////////////////////

                //必填参数//

                string out_trade_no = payInfo.ID.ToString();  //请与贵网站订单系统中的唯一订单号匹配
                string subject = orderInfo.Products[0].ProductName;                    //订单名称，显示在支付宝收银台里的“商品名称”里，显示在支付宝的交易管理的“商品名称”的列表里。
                string body = orderInfo.Products[0].ProductName;                          //订单描述、订单详细、订单备注，显示在支付宝收银台里的“商品描述”里
                string price = payInfo.Amount.ToString();    		        //订单总金额，显示在支付宝收银台里的“商品单价”里

                string logistics_fee = orderInfo.Freight.ToString();                  				//物流费用，即运费。
                string logistics_type = "EXPRESS";				                //物流类型，三个值可选：EXPRESS（快递）、POST（平邮）、EMS（EMS）
                string logistics_payment = "SELLER_PAY";            			//物流支付方式，两个值可选：SELLER_PAY（卖家承担运费）、BUYER_PAY（买家承担运费）

                string quantity = "1";              							//商品数量，建议默认为1，不改变值，把一次交易看成是一次下订单而非购买一件商品。

                //选填参数//

                //买家收货信息（推荐作为必填）
                //该功能作用在于买家已经在商户网站的下单流程中填过一次收货信息，而不需要买家在支付宝的付款流程中再次填写收货信息。
                //若要使用该功能，请至少保证receive_name、receive_address有值
                //收货信息格式请严格按照姓名、地址、邮编、电话、手机的格式填写
                string receive_name = orderInfo.RecieveName;			                    //收货人姓名，如：张三
                string receive_address = orderInfo.RecieveAddress;			                //收货人地址，如：XX省XXX市XXX区XXX路XXX小区XXX栋XXX单元XXX号
                string receive_zip = "000000";                  			    //收货人邮编，如：123456
                string receive_phone = orderInfo.RecieveMobile;                		    //收货人电话号码，如：0571-81234567
                string receive_mobile = orderInfo.RecieveMobile;               		    //收货人手机号码，如：13312341234

                //网站商品的展示地址，不允许加?id=123这类自定义参数
                string show_url = "http://www.999cake.com/site/productlist.aspx";

                ////////////////////////////////////////////////////////////////////////////////////////////////

                //把请求参数打包成数组
                SortedDictionary<string, string> sParaTemp = new SortedDictionary<string, string>();
                sParaTemp.Add("body", body);
                sParaTemp.Add("logistics_fee", logistics_fee);
                sParaTemp.Add("logistics_payment", logistics_payment);
                sParaTemp.Add("logistics_type", logistics_type);
                sParaTemp.Add("out_trade_no", out_trade_no);
                sParaTemp.Add("payment_type", "1");
                sParaTemp.Add("price", price);
                sParaTemp.Add("quantity", quantity);
                sParaTemp.Add("receive_address", receive_address);
                sParaTemp.Add("receive_mobile", receive_mobile);
                sParaTemp.Add("receive_name", receive_name);
                sParaTemp.Add("receive_phone", receive_phone);
                sParaTemp.Add("receive_zip", receive_zip);
                sParaTemp.Add("show_url", show_url);
                sParaTemp.Add("subject", subject);

                //构造标准双接口表单提交HTML数据，无需修改
                Service ali = new Service();
                string sHtmlText = ali.Trade_create_by_buyer(sParaTemp);
                Response.Write(sHtmlText);
            }
            catch (Exception ex)
            {
                JSUtil.Alert("支付错误");
                ExceptionLogBO.Save(ex);

            }
        }
    }
}